#include "Task.hpp"
#include "BlockQueue.hpp"
#include <unistd.h>
struct ThreadData
{
    BlockQueue<func_t> *bq;
    std::string name;
};
void *consumer(void *args)
{
    ThreadData *td = static_cast<ThreadData *>(args);
    while (true)
    {
        sleep(1);
        // Task t;
        func_t f;
        // 1. 从交易场所中，获取数据或者任务
        td->bq->Pop(&f);

        // 2.消费数据
        f();
        // t.Print();
    }
}

void *productor(void *args)
{
    ThreadData *td = static_cast<ThreadData *>(args);
    int data = 1;
    while (true)
    {
        // 1. 生产者，你的数据从哪里来？网路或者其他主机
        // int x = data;
        // int y = data + 1;
        // Task t(x, y);
        // data++;

        // 2. 数据生产到阻塞队列里
        td->bq->Enqueue(PrintLog);
        std::cout << "生产者生产了一个任务" << std::endl;
    }
}
int main()
{
    BlockQueue<func_t> *bq = new BlockQueue<func_t>();
    pthread_t c, p;

    ThreadData ctd = {bq, "消费者"};
    pthread_create(&c, nullptr, consumer, (void *)&ctd);

    ThreadData ptd = {bq, "生产者"};
    pthread_create(&p, nullptr, productor, (void *)&ptd); // TODO

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);

    delete bq;
    return 0;
}